#include "MyArray.h"
#include <iostream>
using namespace std;

// 在MyArray.cpp中添加
void MyArray::inputElementsFromConsole() {
	if (N == 0) {
		cout << "数组长度为0，无法输入元素！" << endl;
		return;
	}
	cout << "请输入" << N << "个整数（空格分隔）：";
	for (int i = 0; i < N; i++) {
		cin >> p[i]; // 类内部可以直接访问私有成员p
	}
}

// 默认构造函数：创建空数组
MyArray::MyArray() {
	p = nullptr;  // 空指针
	N = 0;
}

// 带默认参数的构造函数：创建长度为n的数组，默认元素为0
MyArray::MyArray(int n, int val) {
	if (n <= 0) {  // 处理无效长度
		p = nullptr;
		N = 0;
		return;
	}
	N = n;
	p = new int[N];  // 分配动态空间（先有杯子）
	for (int i = 0; i < N; i++) {
		p[i] = val;  // 给数组赋值（后装水）
	}
}

// 拷贝构造函数：深拷贝
MyArray::MyArray(const MyArray& other) {
	N = other.N;
	if (N == 0) {
		p = nullptr;
		return;
	}
	p = new int[N];  // 为新对象分配独立空间（先有杯子）
	for (int i = 0; i < N; i++) {
		p[i] = other.p[i];  // 拷贝数据（后装水）
	}
}

// 析构函数：释放动态空间
MyArray::~MyArray() {
	if (p != nullptr) {
		delete[] p;  // 释放数组空间
		p = nullptr; // 避免野指针
	}
}

// 数组合并：按顺序合并两个数组
MyArray MyArray::merge(const MyArray& other) {
	MyArray newArr(N + other.N);  // 新数组长度为两个数组长度之和
	// 拷贝当前对象的元素
	for (int i = 0; i < N; i++) {
		newArr.p[i] = p[i];
	}
	// 拷贝另一个对象的元素
	for (int i = 0; i < other.N; i++) {
		newArr.p[N + i] = other.p[i];
	}
	return newArr;
}

// 加法运算：对应元素相加，长度不一致补0
MyArray MyArray::add(const MyArray& other) {
	int maxLen = max(N, other.N);
	MyArray newArr(maxLen);  // 新数组长度为两个数组的最大长度
	for (int i = 0; i < maxLen; i++) {
		// 超出长度的元素按0计算
		int val1 = (i < N) ? p[i] : 0;
		int val2 = (i < other.N) ? other.p[i] : 0;
		newArr.p[i] = val1 + val2;
	}
	return newArr;
}

// 减法运算：对应元素相减，长度不一致补0
MyArray MyArray::subtract(const MyArray& other) {
	int maxLen = max(N, other.N);
	MyArray newArr(maxLen);
	for (int i = 0; i < maxLen; i++) {
		int val1 = (i < N) ? p[i] : 0;
		int val2 = (i < other.N) ? other.p[i] : 0;
		newArr.p[i] = val1 - val2;
	}
	return newArr;
}

// 乘法运算：对应元素相乘，长度不一致补0
MyArray MyArray::multiply(const MyArray& other) {
	int maxLen = max(N, other.N);
	MyArray newArr(maxLen);
	for (int i = 0; i < maxLen; i++) {
		int val1 = (i < N) ? p[i] : 0;
		int val2 = (i < other.N) ? other.p[i] : 0;
		newArr.p[i] = val1 * val2;
	}
	return newArr;
}

// 除法运算：对应元素相除，长度不一致补0，避免除数为0
MyArray MyArray::divide(const MyArray& other) {
	int maxLen = max(N, other.N);
	MyArray newArr(maxLen);
	for (int i = 0; i < maxLen; i++) {
		int val1 = (i < N) ? p[i] : 0;
		int val2 = (i < other.N) ? other.p[i] : 1;  // 除数为0时按1处理
		newArr.p[i] = val1 / val2;  // 整数除法
	}
	return newArr;
}

// 打印数组
void MyArray::printArray() {
	if (N == 0) {
		cout << "数组为空" << endl;
		return;
	}
	for (int i = 0; i < N; i++) {
		cout << p[i] << " ";
	}
	cout << endl;
}